package summer.codegenerator.model.base;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import javax.persistence.AttributeConverter;

import summer.codegenerator.common.util.ClazzUtil;

/**
 * Hibernate @Convert 枚举对象 数据库字段转换
 * ！！！！！！！！！！！！！！！！！！！
 * Enum<?> 必须包含的getIndex方法
 * 
 * @author 蒋振
 * @since 2019年7月10日 下午3:31:10
 */
public class EnumConverter<T> implements AttributeConverter<T, Integer> {

	private Class<?> getObjectClass() {
		Type type = this.getClass().getGenericSuperclass();

		if (type instanceof ParameterizedType) {
			ParameterizedType pt = (ParameterizedType) type;
			Type[] params = pt.getActualTypeArguments();
			return (Class<?>) params[0];
		}
		return null;
	}

	@Override
	public Integer convertToDatabaseColumn(T attribute) {
		try {
			Class<?> clazz = attribute.getClass();
			if (clazz.isEnum() && EnumIndexable.class.isAssignableFrom(clazz)) {
				EnumIndexable ei = (EnumIndexable) attribute;
				return ei.getIndex();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	@SuppressWarnings("unchecked")
	@Override
	public T convertToEntityAttribute(Integer dbData) {
		Class<?> objClass = this.getObjectClass();
		if (dbData != null && dbData > 0 && objClass != null && objClass.isEnum()
				&& EnumIndexable.class.isAssignableFrom(objClass)) {
			try {
				Object enumObj = ClazzUtil.getEnumObjByClassObjAndEnumIndex(objClass, dbData);
				return (T) enumObj;
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return null;
	}
}